home *** CD-ROM | disk | FTP | other *** search
- (*===========================================================================*)
- (* Debugging programs *)
- (* *)
- (* Copyright 1988, 1989, 1990, 1991, 1992 by H. Roy Engehausen. All *)
- (* rights reserved. *)
- (* *)
- (*===========================================================================*)
-
- {$O+}
-
- UNIT BBBUG;
-
- INTERFACE
-
- USES bbdummy;
-
- FUNCTION c2x(instr : STRING) : STRING;
- FUNCTION b2x(inb : BYTE) : str2;
- FUNCTION w2x(inw : WORD) : str8;
- FUNCTION a2x(inw : WORD) : str8;
- FUNCTION p2x(inp : POINTER) : str15;
- FUNCTION pw2x(inw1, inw2 : WORD) : str15;
- FUNCTION l2c(inl : LONGINT) : str8;
- PROCEDURE semaphore_bug (sem_num : BYTE; halt_system : BOOLEAN);
-
- (*---------------------------------------------------------------------------*)
- (* Ok! Let's start work. *)
- (*---------------------------------------------------------------------------*)
-
- IMPLEMENTATION
-
- USES
- CRT,
- bbdump,
- bbstr;
-
- (*===========================================================================*)
- (* Convert an incoming string to hexidecimal characters *)
- (*===========================================================================*)
-
- FUNCTION c2x(instr : STRING) : STRING;
- VAR
- i : BYTE;
- j : BYTE;
- k : BYTE;
- out : STRING;
-
- BEGIN;
-
- i := 0;
- out := '';
-
- WHILE (i < LENGTH(instr)) DO
- BEGIN;
- i := i + 1;
- j := ORD(instr[i]);
-
- out[2*i-1] := byte_to_char[j SHR 4];
- out[2*i ] := byte_to_char[j AND $0F];
-
- END;
-
- out[0] := CHR(2*i);
-
- c2x := out;
-
- END;
-
- FUNCTION b2x(inb : BYTE) : str2;
-
- VAR
- out : STRING[2];
-
- BEGIN;
-
- out[0] := CHR(2);
- out[1] := byte_to_char[inb SHR 4];
- out[2] := byte_to_char[inb AND $0F];
-
- b2x := out;
-
- END;
-
- FUNCTION w2x(inw : word) : str8;
- VAR
- i : BYTE;
- j : BYTE;
- k : BYTE;
- instr : STRING[2];
- out : str8;
-
- BEGIN;
-
- instr[0] := CHR(2);
- instr[1] := CHR(HI(inw));
- instr[2] := CHR(LO(inw));
-
- i := 0;
- out := '';
-
- WHILE (i < LENGTH(instr)) DO
- BEGIN;
- i := i + 1;
- j := ORD(instr[i]);
-
- out[2*i-1] := byte_to_char[j SHR 4];
- out[2*i ] := byte_to_char[j AND $0F];
-
- END;
-
- out[0] := CHR(2*i);
-
- w2x := out;
-
- END;
-
- FUNCTION a2x(inw : word) : str8;
- VAR
- i : BYTE;
- j : BYTE;
- k : BYTE;
- instr : STRING[2];
- out : str8;
-
- BEGIN;
-
- instr[0] := CHR(2);
- instr[1] := CHR(HI(inw));
- instr[2] := CHR(LO(inw));
-
- i := 0;
- out := '';
-
- WHILE (i < LENGTH(instr)) DO
- BEGIN;
- i := i + 1;
- j := ORD(instr[i]);
- k := j SHR 4;
-
- out[2*i-1] := byte_to_char[j SHR 4];
- out[2*i ] := byte_to_char[j AND $0F];
-
- END;
-
- out[0] := CHR(2*i);
-
- a2x := out;
-
- END;
-
- FUNCTION p2x(inp : POINTER) : str15;
- BEGIN;
- p2x := a2x(SEG(inp^)) + ':' + a2x(OFS(inp^));
- END;
-
- FUNCTION pw2x(inw1, inw2 : WORD) : str15;
- BEGIN;
- pw2x := a2x(inw1) + ':' + a2x(inw2);
- END;
-
- FUNCTION l2c(inl : LONGINT) : str8;
- VAR
- s : str8;
- x : ARRAY[1..4] OF BYTE;
- BEGIN;
- MOVE(inl, x, 4);
- s := b2x(x[1]);
- s := s + b2x(x[2]);
- s := s + b2x(x[3]);
- s := s + b2x(x[4]);
- l2c := s;
- END;
-
- (*===========================================================================*)
- (* Semaphore bug detected *)
- (*===========================================================================*)
-
- PROCEDURE semaphore_bug (sem_num : BYTE; halt_system : BOOLEAN);
-
- BEGIN;
-
- WRITELN('Semaphore bug!!!');
-
- dump_reason('Semaphore # ' + w2c(sem_num));
-
- WITH active_tcb^ DO
- dump_reason('Active = ' + w2c(tcb_number) + ' ' + tcb_name + ' '
- + port_chan_s);
-
- dump_semaphores;
-
- IF halt_system THEN
- HALT;
-
- END;
-
- END.